package day14;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

// 测试 List接口
public class Test4_List {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("美队");
        list.add("蜘蛛侠");
        list.add("美队");
        list.add(null);
        list.add("蜘蛛侠");
        list.add("猪猪侠");
        list.add(null);
 //TODO 1, List接口的特点: 元素有序 + 元素可重复 + 可以存多个null + 有下标
        //[美队, 蜘蛛侠, 美队, null, 蜘蛛侠, 猪猪侠, null]
        System.out.println(list);
//        method(list);//继承自Collection接口的方法
        method2(list);//特有的方法
    }
    //2, List接口的 特有的方法 -- 因为List接口有下标
    public static void method2(List<String> list) {
        list.add(4,"绿巨人");//在指定的索引处,插入指定的元素
        System.out.println( list.get(3) );//根据下标获取元素
        System.out.println( list.indexOf("蜘蛛侠") );//获取蜘蛛侠第一次出现的索引
        System.out.println( list.lastIndexOf("蜘蛛侠"));//获取蜘蛛侠最后一次出现的索引
        System.out.println( list.remove(3) );//根据下标删除元素
        System.out.println( list.set(2,"灭霸"));//把2下标的元素换成 灭霸
        List<String> list2 = list.subList(2, 5);//截取子List从2开始到5结束[2,5)
//        boolean addAll(int index, Collection<? extends E> c)
        //TODO 迭代List集合的元素
//方式1:: Iterator<E> iterator() --继承自Collection接口
        Iterator<String> it = list.iterator();
        while( it.hasNext() ){//有元素再获取
            String s = it.next();
            System.out.println(s+"====");
        }
//方式2:: ListIterator<E> listIterator() --List接口特有的
//TODO 面试题:iterator() 和 listIterator() 的区别 ?
        //出处不一样,,,,返回值是Iterator接口 和ListIterator接口,,是继承关系.
        //ListIterator接口是一个子接口能用父接口的所有方法,而且做了方法扩展(逆向遍历)
        ListIterator<String> it2 = list.listIterator();
        while(it2.hasNext()){
            String s = it2.next();
            System.out.println(s+"~~~~");
        }
        //逆向遍历--了解 -- 必须先顺序遍历!!!
        while(it2.hasPrevious()){
            String s = it2.previous();
            System.out.println(s +"---");
        }
//方式3:: 由于List集合有下标,可以按照下标遍历
        for(int i = 0 ; i< list.size() ; i++){
            String s = list.get(i);//根据下标获取元素
            System.out.println(s+"\\\\");
        }
//方式4:: 增强for循环
        for(String  s : list){
            System.out.println(s+"==");
        }
    }
    //TODO 继承自Collection接口的方法
    public static void method(List<String> a) {
        //TODO  同 Test3_Collection.java
        for(String s : a){
            System.out.println(s);
        }
    }
}
